package edu.cqie.smartfarm.verify.aspect;

import edu.cqie.smartfarm.constant.CommonConstant;
import edu.cqie.smartfarm.constant.MessageConstant;
import edu.cqie.smartfarm.utils.ThreadLocalUtil;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;

import java.util.Map;
import java.util.Optional;

@Aspect
@Component
public class AdminPermissionAspect {

    @Pointcut("@annotation(edu.cqie.smartfarm.verify.anno.AdminRequired)&&execution(* edu.cqie.smartfarm.controller.*.*(..))")
    public void adminRequiredMethods() {}

    @Before("adminRequiredMethods()")
    public void checkAdminPermission() {
        // 从ThreadLocalUtil中获取当前线程存储的map对象，该对象通常用于存储特定于线程的信息
        Map<String, String> map = ThreadLocalUtil.get();

        // 使用Optional包装获取map中的USERNAME键对应的值，以优雅地处理可能的空值情况
        Optional<String> usernameOpt = Optional.ofNullable(map.get(CommonConstant.USERNAME));

        // 检查用户名是否存在且包含"admin"，这是为了验证用户是否有权限访问特定资源
        if (!usernameOpt.isPresent() || !usernameOpt.get().contains(CommonConstant.ADMIN)) {
            // 如果用户不是管理员或不存在，则抛出运行时异常，表明用户无权访问该资源
            throw new RuntimeException(MessageConstant.RESOURCE_NOT_FOUND);
        }
    }
}